/*
 * 高德地图和kintone的整合app
 * Copyright (c) 2018 Cybozu
 *
 * Licensed under the MIT License
 */
(function () {
    'use strict';
    var LAT = 'lat'; // 纬度字段名
    var LNG = 'lng'; // 经度字段名
    var ADDRESS = 'address'; // 住址
    var COMPANYNAME = 'companyname'; // 公司名
    var COUNT = 'count';
    var MAPSPACE = 'Map'; // 空白栏的元素id（展示地图用）
    var icon = 'https://webapi.amap.com/theme/v1.3/markers/n/mark_bs.png'; //标注图标

    // 获取经纬度
    function geoLATLNG(event) {
        // 判断是否输入了地址信息
        var record = event.record;
        var gquery = record[ADDRESS].value;
        if (!gquery) {
            return event;
        }

        // 通过地址获取并更新经纬度
        return new kintone.Promise(function (resolve, reject) {
            AMap.plugin('AMap.Geocoder', function () {
                var geocoder = new AMap.Geocoder({
                })
                geocoder.getLocation(gquery, function (status, result) {
                    if (status === 'complete' && result.info === 'OK') {
                        if (result.geocodes) {
                            record[LAT].value = result.geocodes[0].location.lat;
                            record[LNG].value = result.geocodes[0].location.lng;
                        }
                    }
                    else {
                        event.error = '无法获取经纬度';
                    }
                    resolve(event);
                })
            })
        })
    }

    // 记录详细画面，显示地图
    function showMap(lat, lng, companyName) {
        // 地图的div初始化
        var mapEl_address = document.createElement('div');
        mapEl_address.setAttribute('id', 'map_address');
        mapEl_address.style.width = '600px';
        mapEl_address.style.height = '600px';
        mapEl_address.style['z-index'] = 0;

        // 空白栏替换为地图元素
        var elMap = kintone.app.record.getSpaceElement(MAPSPACE);
        elMap.appendChild(mapEl_address);

        var map = new AMap.Map('map_address', {
            center: [lng, lat],
            zoom: 15
        });
        var marker = new AMap.Marker({
            position: new AMap.LngLat(lng, lat),
            offset: new AMap.Pixel(-10, -10),
            icon: icon, // 添加 Icon 图标 URL
            title: companyName
        });
        map.add(marker);
    }

    // 列表页的整体地图及标注显示
    function setLocationIndex(event) {
        var latList = [];
        var lngList = [];
        var countList = [];
        var rec = event.records;

        for (var i = 0; i < rec.length; i++) {
            if (rec[i].lat.value !== undefined && rec[i].lng.value !== undefined) {
                if (rec[i].lat.value.length > 0 && rec[i].lng.value.length > 0) {
                    latList.push(parseFloat(rec[i][LAT].value));
                    lngList.push(parseFloat(rec[i][LNG].value));
                    countList.push(rec[i][COUNT].value);
                }
            }
        }
        // 过滤没有设置经纬度的数据
        if (latList.length === 0) {
            return;
        }

        // 列表页的头部空白部分
        var elAction = kintone.app.getHeaderSpaceElement();

        // 已经存在地图元素时重新初始化
        // ※ 切换页面或者排序时用

        if (document.getElementById('map') !== null && document.getElementById('link') !== null) {
            return;
        }

        // 定义地图元素并添加到头部空白部分
        var myLink = "https://" + window.location.host + '/k/' + kintone.app.getId();

        var mapEl = document.createElement('div');
        mapEl.setAttribute('id', 'map');
        mapEl.setAttribute('style', 'width: auto; height: 600px; border: solid 1px #A8A8A8; z-index: 0;');
        elAction.appendChild(mapEl);

        var layerType = GetUrlParam('layer');

        var link = document.createElement('div');
        link.setAttribute('id', 'link');
        var aEL = document.createElement('a');
        if (layerType == 'satellite') {
            aEL.href = myLink;
            aEL.innerHTML = '不显示卫星';
        }
        else {
            aEL.href = myLink + '/?layer=satellite';
            aEL.innerHTML = '显示卫星';
        }
        link.appendChild(aEL);
        elAction.appendChild(link);

        var latlng = 0;
        var satellite = new AMap.TileLayer.Satellite();
        var roadNet = new AMap.TileLayer.RoadNet();

        var layers;
        if (layerType == 'satellite') {
            layers = [
                satellite,
                roadNet
            ];
        }
        var map = new AMap.Map('map', {
            //mapStyle: 'amap://styles/16fe7b5e27fcb0a1a4da54db76bf9dd1', 
            layers: layers
        });
        var heatmapData = new Array(); // 存放标注点对象的数组

        for (var j = 0; j < latList.length; j++) {
            if (isNaN(latList[j]) === false && isNaN(lngList[j]) === false) {
                if (latlng === 0) {
                    var position = new AMap.LngLat(lngList[j], latList[j]);
                    map.setZoomAndCenter(11, position);
                    latlng = 1;
                }
                var marker = {
                    "lng": lngList[j],
                    "lat": latList[j],
                    "count": countList[j]
                };
                heatmapData.push(marker);
            }
        }
        if (!isSupportCanvas()) {
            event.error = '热力图仅对支持canvas的浏览器适用,您所使用的浏览器不能使用热力图功能,请换个浏览器试试~';
            return;
        }

        var heatmap;
        map.plugin(["AMap.Heatmap"], function () {
            //初始化heatmap对象
            heatmap = new AMap.Heatmap(map, {
                radius: 25, //给定半径
                opacity: [0, 0.8]
            });
            //设置数据集：该数据为北京部分“公园”数据
            heatmap.setDataSet({
                data: heatmapData,
                max: 100
            });
        });

        //判断浏览区是否支持canvas
        function isSupportCanvas() {
            var elem = document.createElement('canvas');
            return !!(elem.getContext && elem.getContext('2d'));
        }
    }

    // 记录详细页
    kintone.events.on('app.record.detail.show', function (event) {
        var rec = event.record;
        var lat = rec[LAT].value;
        var lng = rec[LNG].value;
        var companyName = rec[COMPANYNAME].value;
        if (lat == '' || lng == '') {
            return event;
        }
        showMap(lat, lng, companyName);
    });

    // 添加及修改地址信息时，获取经纬度
    kintone.events.on(['app.record.create.submit', 'app.record.edit.submit', 'app.record.index.edit.submit'], function (event) {
        return geoLATLNG(event);
    });

    // 添加编辑地址时，禁用经纬度的编辑
    kintone.events.on(['app.record.create.show', 'app.record.edit.show', 'app.record.index.edit.show'], function (event) {
        var record = event.record;
        record[LAT].disabled = true;
        record[LNG].disabled = true;
        return event;
    });

    // 列表页的地图显示
    kintone.events.on('app.record.index.show', setLocationIndex);

    // // 列表页编辑时，重载页面
    kintone.events.on('app.record.index.edit.submit.success', function (event) {
        location.reload(true);
    });

    function GetUrlParam(paraName) {
        var url = document.location.toString();
        var arrObj = url.split("?");

        if (arrObj.length > 1) {
            var arrPara = arrObj[1].split("&");
            var arr;

            for (var i = 0; i < arrPara.length; i++) {
                arr = arrPara[i].split("=");

                if (arr != null && arr[0] == paraName) {
                    return arr[1];
                }
            }
            return "";
        }
        else {
            return "";
        }
    }
})();